package tianrun.ziguan.api.calculate.config.utils;

import org.springframework.beans.BeanUtils;
import tianrun.ziguan.api.common.exception.CodeException;

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class MyBeanUtil {

    /**
     * 在声明具有模糊类型（比如：泛型）的可变参数的构造函数或方法时，
     * Java编译器会报unchecked警告。
     * 鉴于这些情况，如果程序员断定声明的构造函数和方法的主体不会对其varargs参数执行潜在的不安全的操作，
     * 可使用@SafeVarargs进行标记，这样的话，Java编译器就不会报unchecked警告。
     */
    @SafeVarargs
    public static <T, R> R doCopy(T source, R target, Setter<? extends Serializable>... varargs) {
        BeanUtils.copyProperties(source, target);
        for (Setter<? extends Serializable> setter : varargs)
            setter.onOk();
        return target;
    }

    public static Map<String, Object> beanToMap(Object object) {
        Map<String, Object> map = new HashMap<>();
        //获取字段数组
        Field[] fields = object.getClass().getDeclaredFields();

        for (Field field : fields) {
            field.setAccessible(true);
            try {
                map.put(field.getName(), field.get(object));
            } catch (IllegalAccessException e) {
                throw new CodeException(e.getMessage());
            }
        }
        return map;
    }
}
